/*
 * LensKit, an open-source toolkit for recommender systems.
 * Copyright 2014-2017 LensKit contributors (see CONTRIBUTORS.md)
 * Copyright 2010-2014 Regents of the University of Minnesota
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
package org.lenskit.data.store;

import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
import it.unimi.dsi.fastutil.longs.LongSet;
import org.lenskit.data.entities.Entity;
import org.lenskit.data.entities.EntityType;
import org.lenskit.data.entities.TypedName;
import org.lenskit.util.collections.LongUtils;

/**
 * Builder for bare entity collections.
 */
class BareEntityCollectionBuilder extends EntityCollectionBuilder {
    private final EntityType entityType;
    private LongSet ids = new LongOpenHashSet();

    BareEntityCollectionBuilder(EntityType et) {
        entityType = et;
    }

    @Override
    public <T> EntityCollectionBuilder addIndex(TypedName<T> attribute) {
        return this;
    }

    @Override
    public EntityCollectionBuilder addIndex(String attrName) {
        return this;
    }

    @Override
    public EntityCollectionBuilder add(Entity e, boolean replace) {
        ids.add(e.getId());
        return this;
    }

    @Override
    public Iterable<Entity> entities() {
        return () -> new BareEntityCollection.EntityIterator(entityType, ids.iterator());
    }

    @Override
    public EntityCollection build() {
        return new BareEntityCollection(entityType, LongUtils.packedSet(ids));
    }
}
